package it.nesimuge.score.blue;

import it.lapomuge.db.dao.DbManagerGare;
import it.lapomuge.db.dao.DbManagerUtenti;
import it.lapomuge.db.entity.Giudice;
import it.lapomuge.db.entity.Partecipazione;
import it.lapomuge.db.entity.Voto;
import it.nesimuge.score.gui.listener.LinstenerPartecipazione;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.microedition.io.StreamConnection;

public class ThreadGuidice extends Thread {

    private InputStream stream;
    private final StreamConnection con;
    int tentativo = 0;
    private static int MAX_TENTATIVI = 5;
    private Partecipazione partecipazione;
    private LinstenerPartecipazione listener;
    private StatoGiudice stato;
    boolean close = false;
    private OutputStream outStream;
    private static int BUFF_LENGTH = 255;

    public ThreadGuidice(StreamConnection con) {
        this.con = con;
        try {
            this.stream = con.openInputStream();
            this.outStream = con.openOutputStream();

        } catch (IOException ex) {
            Logger.getLogger(ThreadGuidice.class.getName()).log(Level.SEVERE, null, ex);

        }
    }

    private String readLine() throws IOException {


        String line = "";
        byte[] buf = new byte[BUFF_LENGTH];
        stream.read(buf);
        for (int i = 0; i < buf.length; i++) {
            line += (char) buf[i];
        }
        return line.trim();

    }

    @Override
    public void run() {
        System.out.println("Creato TH 1");
        try {

            while (!close) {
                System.out.println("In ascolto");
                String line = readLine();
                System.out.println(this.getName() + " manda " + line);
                if (!line.trim().equals("")) {
                    controllaStringa(line);
                    tentativo = MAX_TENTATIVI;
                } else {
                    tentativo--;
                    if (tentativo == 0) {
                        close = true;
                    }
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Chiudo");
    }

    void setPartecipazioneListener(LinstenerPartecipazione listener) {
        this.listener = listener;
    }

    void setPartecipazione(Partecipazione partecipazione) {

        this.partecipazione = partecipazione;
    }

    void setStato(StatoGiudice stato) {
        this.stato = stato;
    }

    private void controllaStringa(String line) {
        String[] split = line.split(";");
        String risposta = null;

        String comando = split[0];

        if (comando.startsWith("login")) {
            String codiceConnessione = stato.giudiceConnesso(split[1], split[2]);
            if (codiceConnessione != null) {
                risposta = codiceConnessione;
            } else {
                risposta = "nologin";
            }
        } else {
            String codice = split[1];
            Giudice g = stato.getStringaConnessione(codice);
            if (g != null) {
                if (comando.equals("next")) {

                    if (partecipazione != null) {
                        //next;idparticepazione;nomecognome"
                        risposta = "next;" + partecipazione.getId() + ";" + partecipazione.getAtleta().getCognome() + " " + partecipazione.getAtleta().getNome();
                    } else {
                        risposta = "nonext";
                    }

                } else if (comando.equals("voto")) {

                    Voto voto = DbManagerGare.getInstance().getVotoFromGiudicePartecipazione(partecipazione, g);
                    if (voto.getVoto() == null) {
                        voto.setVoto(Double.parseDouble(split[2]));
                        fireParticepazioneChange(partecipazione);
                        risposta = "ok";
                    } else {
                        risposta = "kogiavotato";
                    }

                }
            } else {
                risposta = "noconn";
            }

        }




        send(risposta);


    }

    public static void main(String[] args) {
        Giudice giudice = DbManagerUtenti.getInstance().findbByUserPwd("andrea", "muge10");
        System.out.println(giudice.getId());
    }

    private void send(String risposta) {
        System.out.println("Rispondo: " + risposta);
        try {
            outStream.write(risposta.getBytes());
        } catch (IOException ex) {
            Logger.getLogger(ThreadGuidice.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void fireParticepazioneChange(Partecipazione partecipazione) {
        if (this.listener != null) {
            this.listener.fireParticepazioneChange(partecipazione);
        }
    }
}
